package com.netty.bytebuf;

import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;

import java.util.Arrays;

/**
 * @author renyitong
 * @version 1.0.0
 * @createTime 2023年08月10日
 * @Description
 */
public class SliceDemo {

    public static void main(String[] args) {
        // 我们也可以将一个byte[]直接包装进缓冲区（和NIO是一样的）不过写指针的值一开始就跑到最后去了，但是这玩意是只读的
        ByteBuf buf = Unpooled.wrappedBuffer("abcdefg".getBytes());
        //除了包装，也可以复制数据，copiedBuffer()会完完整整将数据拷贝到一个新的缓冲区中
        buf.readByte();   //读取一个字节
        // buf.writeInt(10);  // 直接写抛异常 IndexOutOfBoundsException

        ByteBuf slice = buf.slice();   //现在读指针位于1，然后进行划分
        System.out.println(slice.arrayOffset());   //得到划分出来的ByteBuf的偏移地址

        // 获取切片中的字节数组并打印
        byte[] sliceBytes = new byte[slice.readableBytes()];
        slice.readBytes(sliceBytes);
        String sliceContent = new String(sliceBytes);

        System.out.println("Slice Content: " + sliceContent);

        // 底层数组还是没变，跟nio中的buffer类似
        System.out.println(Arrays.toString(slice.array()));

        // 释放直接缓冲区，回收内存
        buf.release();
    }

}
